package cn.wolfcode.trip.api.controller;

import cn.wolfcode.trip.core.domain.Strategy;
import cn.wolfcode.trip.core.domain.StrategyCatalog;
import cn.wolfcode.trip.core.query.StrategyCommentQueryObject;
import cn.wolfcode.trip.core.query.StrategyQueryObject;
import cn.wolfcode.trip.core.service.IStrategyCatalogService;
import cn.wolfcode.trip.core.service.IStrategyCommentService;
import cn.wolfcode.trip.core.service.IStrategyService;
import com.github.pagehelper.PageInfo;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.HashMap;
import java.util.List;

/**
 * 大攻略地区资源控制器
 */
@RestController
@RequestMapping("strategies")
public class StrategyController {

    @Autowired
    private IStrategyService strategyService;

    @Autowired
    private ServletContext servletContext;

    @Autowired
    private IStrategyCatalogService catalogService;

    @Autowired
    private IStrategyCommentService commentService;

    /**
     * 查询大攻略中状态为推荐的数据 accept=application/json
     * 1.资源路径 /strategies
     * 2.请求动作 get
     * 3.请求参数 state=1
     * 4.返回结果 PageInfo
     */
    @GetMapping(headers = "accept=application/json")
    public PageInfo<Strategy> listAll(StrategyQueryObject qo){

        return strategyService.query(qo);
    }

    /**
     * 查询大攻略数据（html） accept=text/html
     * 1.资源路径 /strategies
     * 2.请求动作 get
     * 3.请求参数
     * 4.返回结果
     */
    @GetMapping(headers = "accept=text/html")
    public void queryHtml(StrategyQueryObject qo, HttpServletResponse response) throws Exception{
        //当前推荐攻略数据
        qo.setState(Strategy.STATE_HOT); // 推荐状态
        qo.setPageSize(0);// 不分页
        PageInfo hot = strategyService.query(qo);
        // 全部攻略数据
        qo.setState(null); // 清空状态条件
        qo.setPageSize(3);// 分页
        PageInfo all = strategyService.query(qo);

        HashMap<String,Object> map = new HashMap<>();
        map.put("hot",hot);
        map.put("all",all);
        // 设置响应类型
        response.setContentType("text/html;charset=utf-8");
        // 创建配置类
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
        // 设置模板所在目录
        cfg.setDirectoryForTemplateLoading(new File(servletContext.getRealPath("templates")));
        // 设置编码
        cfg.setDefaultEncoding("utf-8");
        // 设置模板文件
        Template template = cfg.getTemplate("template.ftl");
        // 合成模板并输出
        template.process(map,response.getWriter());
    }

    /**
     * 根据大攻略id查询大攻略信息
     * 1.资源路径 /strategies/{id}
     * 2.请求动作 get
     * 3.请求参数 无
     * 4.返回结果 大攻略对象
     */
    @GetMapping("{id}")
    public Strategy getById(@PathVariable Long id){

        return strategyService.getById(id);
    }

    /**
     * 根据大攻略id查询攻略目录
     * 1.资源路径 /strategies/{strategyId}/catalogs
     * 2.请求动作 get
     * 3.请求参数 无
     * 4.返回结果 list
     */
    @GetMapping("{strategyId}/catalogs")
    public List<StrategyCatalog> listByStrategyId(@PathVariable Long strategyId){

        return catalogService.listByStrategyId(strategyId);
    }

    /**
     * 根据大攻略id查询评论数据
     * 1.资源路径 /strategies/{strategyId}/comments
     * 2.请求动作 get
     * 3.请求参数 分页参数
     * 4.返回结果 PageInfo
     */
    @GetMapping("{strategyId}/comments")
    public PageInfo query(StrategyCommentQueryObject qo){
        qo.setOrderBy("createTime DESC");
        return commentService.query(qo);
    }
}
